// 封装axios
// 实例化  请求拦截器  响应拦截器
import axios, { AxiosInstance, AxiosResponse, AxiosRequestConfig } from 'axios'
import { parse as parseJSONBigInt } from 'json-bigint';
import { Message } from '@arco-design/web-vue';
import { getToken } from '../utils/auth'

interface HttpResponse<T = any> {
    code: number;
    data: T;
    message: string;
}

// 创建axios实例http
const http:AxiosInstance = axios.create({
  baseURL: 'http://127.0.0.1:4523/m1/4098231-0-default',
  timeout: 5000,
  transformResponse: [
    (data: any) => {
      try {
        // 如果转换成功则返回转换的数据结果
        return parseJSONBigInt(data)
      } catch (err) {
        // 如果转换失败，则包装为统一数据格式并返回
        return {
          data
        }
      }
    },
  ],
})

// 给axios的实例http 添加响应拦截器
http.interceptors.response.use(
  (res:AxiosResponse<HttpResponse>) => {
    const { code, data } = res.data
    // console.log(data)
    // 首先判断token在后台验证是否有效
    if (code === 401) {
      // token无效或者登录失败，跳转到登录页面
      Message.error('登陆失败，请重新登录！')
      // window.navigate('/login', { replace: true })
      router.push({
        name:'login'
      })
    } else if (code === 403) {
      Message.error('您没有访问权限！')
    }
    return data
  },
  (error) => {
    // 处理错误
    return Promise.reject(error)
  }
)

// 给axios的实例http 添加请求拦截器
http.interceptors.request.use((config: AxiosRequestConfig) => {
    const token = getToken();
    if (token) {  
      // 确保 headers 已经定义，否则初始化它  
      if (!config.headers) {  
        config.headers = {};  
      }  
      // 现在可以安全地设置 Authorization 头部了  
      config.headers.Authorization = token;
    }  
  return config
})

// 导出axios的实例http
export default http
